package br.com.toscano.gobra.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.faces.model.SelectItem;
import javax.inject.Inject;

import br.com.toscano.gobra.business.ObraBC;
import br.com.toscano.gobra.business.PagamentoBC;
import br.com.toscano.gobra.business.TipoDocumentoPagamentoBC;
import br.com.toscano.gobra.business.UnidadeOrcamentariaBC;
import br.com.toscano.gobra.domain.BoletimMedicao;
import br.com.toscano.gobra.domain.Obra;
import br.com.toscano.gobra.domain.Pagamento;
import br.com.toscano.gobra.domain.TipoDocumentoPagamento;
import br.com.toscano.gobra.domain.UnidadeOrcamentaria;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./pagamento_list.jsf")
public class PagamentoEditMB extends AbstractEditPageBean<Pagamento, Long> {

	private static final long serialVersionUID = 1L;

	private BigDecimal somatorioValoresPagos;
	
	@Inject
	private UnidadeOrcamentariaBC unidadeOrcamentariaBC;
	private List<SelectItem> unidadeOrcamentarias;
	private Long unidadeOrcamentaria;

	public List<SelectItem> getUnidadeOrcamentarias() {
		unidadeOrcamentarias = new ArrayList<SelectItem>();
		List<UnidadeOrcamentaria> lista = unidadeOrcamentariaBC.findAll();
		for (UnidadeOrcamentaria obj: lista) {
			unidadeOrcamentarias.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return unidadeOrcamentarias;
	}

	public void setUnidadeOrcamentarias(List<SelectItem> unidadeOrcamentarias) {
		this.unidadeOrcamentarias = unidadeOrcamentarias;
	}

	public Long getUnidadeOrcamentaria() {
		if(obra == null && this.getBean().getObra() != null) {
			unidadeOrcamentaria = this.getBean().getObra().getUnidadeOrcamentaria().getId();
		}
		return unidadeOrcamentaria;
	}

	public void setUnidadeOrcamentaria(Long unidadeOrcamentaria) {
		this.unidadeOrcamentaria = unidadeOrcamentaria;
	}
	

	private Map<BoletimMedicao,Boolean> checkMap = new HashMap<BoletimMedicao,Boolean>();
	private List<BoletimMedicao> boletimMedicaos;

	
	public List<BoletimMedicao> getItems() {
		if (boletimMedicaos == null && this.getObra() != null) {
			boletimMedicaos = this.obraBC.load(this.getObra()).getListaBoletimMedicao();
		}
		return boletimMedicaos;
	}

	public Map<BoletimMedicao, Boolean> getCheckMap() {
		return checkMap;
	}
	
	public List<BoletimMedicao> getSelected() {
		List<BoletimMedicao> result = new ArrayList<BoletimMedicao>();
		
	    for (Entry<BoletimMedicao,Boolean> entry : checkMap.entrySet()) {
	        if (entry.getValue()) {
	            result.add(entry.getKey());
	        }
	    }
	    return result;
	}
	
	@Inject
	private TipoDocumentoPagamentoBC tipoDocumentoPagamentoBC;
	private List<SelectItem> tipoDocumentoPagamentos;
	private Long tipoDocumentoPagamento;

	
	public TipoDocumentoPagamentoBC getTipoDocumentoPagamentoBC() {
		return tipoDocumentoPagamentoBC;
	}

	public void setTipoDocumentoPagamentoBC(
			TipoDocumentoPagamentoBC tipoDocumentoPagamentoBC) {
		this.tipoDocumentoPagamentoBC = tipoDocumentoPagamentoBC;
	}

	public List<SelectItem> getTipoDocumentoPagamentos() {
		tipoDocumentoPagamentos = new ArrayList<SelectItem>();
		List<TipoDocumentoPagamento> lista = tipoDocumentoPagamentoBC.findAll();
		for (TipoDocumentoPagamento obj: lista) {
			tipoDocumentoPagamentos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return tipoDocumentoPagamentos;
	}

	public void setTipoDocumentoPagamentos(List<SelectItem> tipoDocumentoPagamentos) {
		this.tipoDocumentoPagamentos = tipoDocumentoPagamentos;
	}

	public Long getTipoDocumentoPagamento() {
		if(tipoDocumentoPagamento == null && this.getBean().getDocumentoPagamento() != null) {
			tipoDocumentoPagamento = this.getBean().getDocumentoPagamento().getId();
		}
		return tipoDocumentoPagamento;
	}

	public void setTipoDocumentoPagamento(Long tipoDocumentoPagamento) {
		this.tipoDocumentoPagamento = tipoDocumentoPagamento;
	}


	@Inject
	private ObraBC obraBC;
	private List<SelectItem> obras;
	private Long obra;

	public List<SelectItem> getObras() {
		obras = new ArrayList<SelectItem>();
		List<Obra> lista = obraBC.findAll();
		for (Obra obj: lista) {
			obras.add(new SelectItem(obj.getId() , obj.getTitulo()));
		}
		return obras;
	}

	public void setObras(List<SelectItem> obras) {
		this.obras = obras;
	}

	public Long getObra() {
		if(obra == null && this.getBean().getObra() != null) {
			obra = this.getBean().getObra().getId();
			unidadeOrcamentaria = this.getBean().getObra().getUnidadeOrcamentaria().getId();
		}
		return obra;
	}

	public void setObra(Long obra) {
		this.obra = obra;
	}
	
	
	@Inject
	private PagamentoBC pagamentoBC;
	
	@Override
	@Transactional
	public String delete() {
		this.pagamentoBC.delete(getId());
		return getPreviousView();
	}

	public void montarObjeto(){
		if(this.obra != null) {
			this.getBean().setObra(this.obraBC.load(this.obra));
		}	
		if(this.tipoDocumentoPagamento != null) {
			this.getBean().setDocumentoPagamento(this.tipoDocumentoPagamentoBC.load(this.tipoDocumentoPagamento));
		}	
		
		if (somatorioValoresPagos != null) {
			this.getBean().setValorPagamento(somatorioValoresPagos);
		}
	}

	@Override
	@Transactional
	public String insert() {
		montarObjeto();
		this.pagamentoBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montarObjeto();
		this.pagamentoBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Pagamento handleLoad(Long id) {
		setBean(this.pagamentoBC.load(id));

		getItems();
		
		if(this.getBean() != null && this.getBean().getListaBoletimMedicao() != null) {
			for (BoletimMedicao pa : boletimMedicaos) {
				if (!pa.getStatusPagamento().equals(BoletimMedicao.PAGO_TOTAL)) {

					for (BoletimMedicao paCadastrado : this.getBean().getListaBoletimMedicao()) {
						if (pa.equals(paCadastrado)) {
							checkMap.put(pa, new Boolean(true));
						}
					}
					if (checkMap.get(pa) == null ) {
						checkMap.put(pa, new Boolean(false));
					}
				}
			}
		}

		return this.getBean();
	}

	public BigDecimal getSomatorioValoresPagos() {
		if(somatorioValoresPagos == null && this.getBean().getValorPagamento() != null)
			somatorioValoresPagos = this.getBean().getValorPagamento();
		return somatorioValoresPagos;
	}

	public void setSomatorioValoresPagos(BigDecimal somatorioValoresPagos) {
		this.somatorioValoresPagos = somatorioValoresPagos;
	}

}